home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Spanish Scene 1
/
SpanishScene1.iso
/
spanish pack n°1 by llfb
/
revistas
/
fanzine
/
fanzine10-1.dms
/
fanzine10-1.adf
/
EjemploVoz
/
EjemploVOZ.c
< prev
Wrap
C/C++ Source or Header
|
1994-11-04
|
9KB
|
205 lines
/* ----------------------------------------------------------------------- */
/* Programación 'Made in Amiga': Empleo general de dispositivos */
/* Ejemplo VOZ (funciona como una aplicación CLI) */
/* por Dámaso D. Estévez (NOV-1994) */
/* para la revista FANZINE en disco */
/* Dominio Público */
/* */
/* REQUIERE : KickStart 2.0 o superior. */
/* PROBADO EN: Amiga 1200 (KickStart 3.0) estándar con HD y */
/* Amiga 1200 (KickStart 1.3) estándar (je, je). X-D */
/* */
/* Compilado con DICE C versión no registrada 2.06.21 de Dominio Público */
/* OPCIONES: -2.0 -v -f */
/* ----------------------------------------------------------------------- */
/* ======================================================================= */
/* Ficheros estándar del C */
/* ^^^^^^^^^^^^^^^^^^^^^^^ */
#include <stdio.h>
#include <string.h>
/* Ficheros propiedad de C= para Amiga */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
#include <dos/dos.h>
#include <exec/exec.h>
#include <exec/types.h>
#include <devices/narrator.h>
/* CADENA DE VERSIÓN SEGÚN ESPECIFICACIONES DE C= */
/* a añadir a todas tus programas: suele contener el */
/* nombre del programa, la versión, fecha y el nombre */
/* programador, al menos. */
/* Ejecuta desde CLI el programa Version situado en C: */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
const char Vers[]="$VER: VOZ 0.4 por D. Ðstévez para FANZINE (NOV-94)";
extern struct Library *SysBase;
/* ======================================================================= */
int main(void)
{
int contador;
/* Valor distinto de cero indica error y su tipo */
/* Útil para ejecución y control desde scripts */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
UBYTE error = 0;
/* Estructuras para puertos y petición E/S (voz) */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
struct MsgPort *puerto1;
struct narrator_rb *voz;
/* Cadena fonemas a pronunciar: Fanzine, la mejor revista en disco para Amiga */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
char *fonemas="FAHNTHIH6N, LAH MEH/HOHR REHVIH3STAH EHN DIH3SKAO PAH1RAH AHMIH5GAH.";
/* Definición de canales a emplear */
/* BYTE canales[4] = {3, 5, 10, 12}; */
/* Esta definición funcionará con SAS/Lattice, */
/* pero no con DICE C (es el que yo empleo), así */
/* que uso el siguiente método opcional ... */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
BYTE canales[4];
canales[0]=3;
canales[1]=5;
canales[2]=10;
canales[3]=12;
printf("\n");
printf("
Programa de ejemplo para FANZINE en disco - Dispositivos
\n\n");
/* VERIFICO SI EL KICKSTART ES >= 2.0 AUNQUE ESPECIFIQUE EN LA */
/* DOCUMENTACIÓN LOS REQUERIMIENTOS (¡LOS HAY MUY DESPISTADOS!) */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
if(SysBase->lib_Version>=36) {
if(puerto1=(struct MsgPort *) CreateMsgPort("EjemploVoz",0)) {
printf(" -Creado puerto 'EjemploVoz' con
CreateMsgPort
y");
if(voz=(struct narrator_rb *) CreateIORequest(puerto1, sizeof(struct narrator_rb))) {
printf(" petición E/S con
CreateIORequest
.\n");
/* Activo las nuevas características bajo KickStart 2.0 */
/* del sintetizador de voz (perturbación, entusiasmo, etc). */
/* SIEMPRE ANTES DE EJECUTAR OpenDevice(). */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
voz->flags = NDF_NEWIORB;
if(OpenDevice("narrator.device",0,(struct IORequest *)voz,0L)) {
/* ADVERTENCIA: En contra de lo habitual con otras funciones, */
/* si OpenDevice() devuelve un valor positivo es */
/* que FRACASÓ. */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
printf("No he podido abrir 'narrator.device'.\nTerminando ...\n");
}
else {
printf(" -Acceso abierto con
OpenDevice
a 'narrator.device'.\n\n");
/* Para conocer todos los campos de la estructura, consulte */
/* el fichero translator.h (en includes/devices) y/o el 'Amiga */
/* ROM Kernel Reference Manual: Devices' en su capítulo 8. */
/* Los parámetros los he probado con el programa de Chris */
/* Demiris 'SpeechToy 2'. */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
voz->ch_masks = &canales[0];
voz->nm_masks = sizeof(canales);
voz->message.io_Command = CMD_WRITE;
voz->message.io_Data = fonemas;
voz->message.io_Length = strlen(fonemas);
voz->sex = MALE; /* Sexo voz: MALE, FEMALE */
voz->volume = 50; /* Volumen (0-64) */
voz->rate = 120; /* Velocidad (40-400 palabras/min) */
voz->pitch = 150; /* Frec. base voz (65-320)*/
voz->mode = NATURALF0; /* Tipo de habla */
voz->F0perturb = 50; /* Perturbación formante cero */
voz->F0enthusiasm = 64; /* Entusiasmo formante cero */
voz->F1adj = -4; /* Ajuste primera formante */
voz->priority = 50; /* Prioridad */
/* Envío de la petición E/S al dispositivo */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
printf(" -Envío de la petición síncrona con
DoIO
:\n mientras 'habla' se congela el avance del programa.\n\n");
DoIO(voz);
/* Cuenta hasta 3 (~3 segs.) Pero NO se ejecuta hasta */
/* que DoIO acabe de ejecutar la petición. */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
for(contador=1;contador<4;contador++) {
printf(" Contando hasta tres ...
%d
\n",contador);
Delay( 1 * 50 ); /* Espera de un segundo */
}
printf("\n");
voz->mode = MANUALF0;
printf(" -Envío de la petición asíncrona con
SendIO
:\n ahora mientras 'habla' NO se congela el avance del programa.\n\n");
/* Envío de la misma petición E/S con la ÚNICA modificación */
/* del modo de habla ahora de forma asíncrona. */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
SendIO(voz);
/* Cuenta hasta 3 (~3 segs.). Se ejecuta mientras habla */
/* pues SendIO devuelve el control inmediatamente. */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
for(contador=1;contador<4;contador++) {
printf(" Contando hasta tres ...
%d
\n",contador);
Delay( 1 * 50 );
}
printf("\n");
/* Cancelamos la petición, si aún no se ha ejecutado completamente */
/* (en las pruebas se corta el habla en la palabra 'disco') */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
printf(" -Comprobando petición con
CheckIO
y cancelándola si está pendiente con
AbortIO
.\n");
if(!(CheckIO(voz))) AbortIO(voz);
WaitIO(voz);
printf(" -Cerrando con
CloseDevice
el dispositivo 'narrator.device'.\n");
CloseDevice((struct IORequest *)voz);
}
printf(" -Borrando la petición E/S con
DeleteIORequest
y");
DeleteIORequest(voz);
}
else {
error = 3;
printf("No he podido crear la petición E/S.\nFIN.\n");
}
printf(" borrando el puerto con
DeleteMsgPort
.\n");
DeleteMsgPort(puerto1);
}
else {
error = 2;
printf("No he podido crear el puerto de mensajes.\nFIN.\n");
}
}
else {
error = 1;
printf("\n¡Lo siento, necesito KickStart >= 2.0!. FIN.\n");
}
printf("\n");
exit(error);
};
/* ======================================================================= */
/* Vuelca en papel el listado (160 caracteres/línea y Elite Condensada) */
/* para poder leerlo con tranquilidad y sin quemar la vista. He añadido */
/* comentarios en el listado como se puede ver, además de que el programa */
/* informa sobre los pasos básicos que va dando en la gestión del disposi- */
/* tivo. */
/* ======================================================================= */